/**
 * @file 通用类型定义
 * @description 定义应用程序中使用的通用类型和接口
 * @author 黄敏
 * @version 1.0.0
 * @since 2025-06-27
 */
import type { ProcessMetric } from 'electron'

/**
 * 基础响应接口
 */
export interface BaseResponse<T = unknown> {
  /** 是否成功 */
  success: boolean
  /** 响应数据 */
  data?: T
  /** 错误信息 */
  message?: string
  /** 错误代码 */
  code?: string | number
}

/**
 * 分页参数接口
 */
export interface PaginationParams {
  /** 页码，从1开始 */
  page: number
  /** 每页数量 */
  pageSize: number
  /** 排序字段 */
  sortBy?: string
  /** 排序方向 */
  sortOrder?: 'asc' | 'desc'
}

/**
 * 分页响应接口
 */
export interface PaginationResponse<T = unknown> {
  /** 数据列表 */
  items: T[]
  /** 总数量 */
  total: number
  /** 当前页码 */
  page: number
  /** 每页数量 */
  pageSize: number
  /** 总页数 */
  totalPages: number
}

/**
 * 窗口尺寸接口
 */
export interface WindowDimensions {
  /** 宽度 */
  width: number
  /** 高度 */
  height: number
}

/**
 * 窗口位置接口
 */
export interface WindowPosition {
  /** X坐标 */
  x: number
  /** Y坐标 */
  y: number
}

/**
 * 窗口边界接口
 */
export interface WindowBounds extends WindowDimensions, Partial<WindowPosition> {
  /** 是否最大化 */
  isMaximized?: boolean
  /** 右侧宽度 */
  rightWidth?: number
}

/**
 * 事件监听器接口
 */
export interface EventListener<T = unknown> {
  /** 事件名称 */
  eventName: string
  /** 监听器函数 */
  listener: (...args: T[]) => void
  /** 是否为一次性监听器 */
  once?: boolean
}

/**
 * 配置项接口
 */
export interface ConfigItem<T = unknown> {
  /** 配置键 */
  key: string
  /** 配置值 */
  value: T
  /** 配置描述 */
  description?: string
  /** 是否为必需配置 */
  required?: boolean
  /** 默认值 */
  defaultValue?: T
}

/**
 * 日志级别枚举
 */
export enum LogLevel {
  DEBUG = 'debug',
  INFO = 'info',
  WARN = 'warn',
  ERROR = 'error'
}

/**
 * 日志条目接口
 */
export interface LogEntry {
  /** 日志级别 */
  level: LogLevel
  /** 日志消息 */
  message: string
  /** 时间戳 */
  timestamp: Date
  /** 额外数据 */
  data?: Record<string, unknown>
  /** 错误堆栈 */
  stack?: string
}

/**
 * 操作结果接口
 */
export interface OperationResult<T = unknown> {
  /** 是否成功 */
  success: boolean
  /** 结果数据 */
  data?: T
  /** 错误信息 */
  error?: string
  /** 操作耗时（毫秒） */
  duration?: number
}

/**
 * 键值对接口
 */
export interface KeyValuePair<K = string, V = unknown> {
  key: K
  value: V
}

/**
 * 选项接口
 */
export interface Option<T = unknown> {
  /** 显示标签 */
  label: string
  /** 选项值 */
  value: T
  /** 是否禁用 */
  disabled?: boolean
  /** 图标 */
  icon?: string
  /** 描述 */
  description?: string
}

/**
 * 菜单项接口
 */
export interface MenuItem {
  /** 菜单ID */
  id: string
  /** 显示标签 */
  label: string
  /** 图标 */
  icon?: string
  /** 点击处理函数 */
  onClick?: () => void
  /** 子菜单 */
  children?: MenuItem[]
  /** 是否禁用 */
  disabled?: boolean
  /** 是否可见 */
  visible?: boolean
  /** 快捷键 */
  accelerator?: string
}

/**
 * 通用回调函数类型
 */
export type Callback<T = void> = (result: T) => void

/**
 * 异步回调函数类型
 */
export type AsyncCallback<T = void> = (result: T) => Promise<void>

/**
 * 事件处理函数类型
 */
export type EventHandler<T = unknown> = (...args: T[]) => void

/**
 * 清理函数类型
 */
export type CleanupFunction = () => void

/**
 * 可选的清理函数类型
 */
export type MaybeCleanupFunction = CleanupFunction | void

/**
 * 深度只读类型
 */
export type DeepReadonly<T> = {
  readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P]
}

/**
 * 深度可选类型
 */
export type DeepPartial<T> = {
  [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P]
}

/**
 * 提取数组元素类型
 */
export type ArrayElement<T> = T extends (infer U)[] ? U : never

/**
 * 提取Promise结果类型
 */
export type PromiseResult<T> = T extends Promise<infer U> ? U : T

export interface Process {
  pid: number
  type: ProcessMetric['type']
  name?: string
  cpu: string
  creationTime: number
  memory: string
  sandboxed?: boolean
}

export interface ProcessDetail {
  totalCpu: string
  totalMemory: string
  process: Process[]
}

/**
 * 弹窗配置接口
 */
export interface PopupOptions {
  /** 弹窗URL */
  url: string
  /** 弹窗标题 */
  title?: string
  /** 弹窗宽度，默认800 */
  width?: number
  /** 弹窗高度，默认600 */
  height?: number
  /** 是否可调整大小，默认true */
  resizable?: boolean
  /** 是否显示菜单栏，默认false */
  menuBar?: boolean
  /** 是否置顶，默认false */
  alwaysOnTop?: boolean
  /** 是否模态窗口，默认false */
  modal?: boolean
  /** 最小宽度 */
  minWidth?: number
  /** 最小高度 */
  minHeight?: number
  /** 最大宽度 */
  maxWidth?: number
  /** 最大高度 */
  maxHeight?: number
}
